package com.lizhe.jdbc.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * 类描述:
 * jdbc多数据源配置类
 * primaryDataSource 和 secondaryDataSource 都是 DataSource接口的实例化对象（Bean）
 *
 * @author Administrator
 * @create 2021-10-26 22:29
 */
@Configuration
public class DataSourceConfig {

    // @Primary注解的作用是当一个接口有多个实现类的时候，我们在主实现类对象的上面加上这个注解。表示当Spring如果只能选一个实现进行依赖注入的时候，
    // 就选@Primary标识的这个Bean。（如果这个项目只使用一个数据源，那就是primaryDataSource）
    // @Primary
    // @Bean(name = "primaryDataSource")
    // @ConfigurationProperties(prefix="spring.datasource.primary")   //testdb
    // public DataSource primaryDataSource(){
    //     return DataSourceBuilder.create().build();
    // }
    //
    // @Bean(name = "secondaryDataSource")
    // @ConfigurationProperties(prefix="spring.datasource.secondary")   //testdb2
    // public DataSource secondaryDataSource() {
    //     return DataSourceBuilder.create().build();
    // }
    //
    // // @Qualifier明确通过编码的形式说明，当一个接口有多个实现类对象Bean的时候，我要使用哪一个Bean。
    // @Bean(name="primaryJdbcTemplate")
    // public JdbcTemplate primaryJdbcTemplate (@Qualifier("primaryDataSource") DataSource dataSource ) {
    //     return new JdbcTemplate(dataSource);
    // }
    //
    // @Bean(name="secondaryJdbcTemplate")
    // public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {
    //     return new JdbcTemplate(dataSource);
    // }


    //jta数据源primarydb
    @Bean(initMethod="init", destroyMethod="close", name="primaryDataSource")
    @Primary
    @ConfigurationProperties(prefix = "primarydb")
    public DataSource primaryDataSource() {
        //这里是关键，返回的是AtomikosDataSourceBean，所有的配置属性也都是注入到这个类里面
        return new AtomikosDataSourceBean();
    }

    //jta数据源secondarydb
    @Bean(initMethod="init", destroyMethod="close", name="secondaryDataSource")
    @ConfigurationProperties(prefix = "secondarydb")
    public DataSource secondaryDataSource()  {
        return new AtomikosDataSourceBean();
    }

    //primaryJdbcTemplate使用primaryDataSource数据源
    @Bean
    public JdbcTemplate primaryJdbcTemplate(
            @Qualifier("primaryDataSource") DataSource primaryDataSource) {
        return new JdbcTemplate(primaryDataSource);
    }

    //secondaryJdbcTemplate使用secondaryDataSource数据源
    @Bean
    public JdbcTemplate secondaryJdbcTemplate(
            @Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
        return new JdbcTemplate(secondaryDataSource);
    }
}